/*
** client.c -- a stream socket client demo
*/

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <unistd.h>
#include <sys/times.h>

#define PORT 4243    /* the port client will be connecting to */

#define MAXDATASIZE 200 /* max number of bytes we can get or send at once */

int main(int argc, char *argv[])
{
    int sockfd, sendlinecount=0, recvlinecount=0, maxline=0, sendcharcount=0, recvcharcount=0;  
    int numbytes;
    char buf_send[MAXDATASIZE];
    char buf_recv[MAXDATASIZE];
    struct hostent *he;
    struct sockaddr_in their_addr; /* connector's address information */
    struct tms str_start_time, str_stop_time;
    double time;
    static clock_t start_time, stop_time;
    FILE *wsock, *rsock;
    
    
    if (argc != 2) {
        fprintf(stderr,"usage: client hostname\n");
        exit(1);
    }

    if ((he=gethostbyname(argv[1])) == NULL) {  /* get the host info */
        perror("gethostbyname");
        exit(1);
    }

    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
        perror("socket");
        exit(1);
    }

    their_addr.sin_family = AF_INET;         /* host byte order */
    their_addr.sin_port = htons(PORT);     /* short, network byte order */
    their_addr.sin_addr = *((struct in_addr *)he->h_addr);
    bzero(&(their_addr.sin_zero), 8);        /* zero the rest of the struct */

    start_time=times(&str_start_time);

    if (connect(sockfd, (struct sockaddr *)&their_addr, sizeof(struct sockaddr)) == -1) {
        perror("connect");
        exit(1);
    }

    wsock = fdopen(sockfd,"w+");
    rsock = fdopen(sockfd,"r+");
    
    while (fgets(buf_send, MAXDATASIZE, stdin) != NULL) {
      
      if ((fputs(buf_send,wsock)) == EOF) {
        perror("write");
        exit(1);
      }
      
      numbytes = strlen(buf_send);
      
      fflush(wsock);
      
/*    while (fgets(buf_send, MAXDATASIZE, stdin) != NULL) {
      if ((numbytes=write(sockfd, buf_send, strlen(buf_send))) == -1) {
        perror("write");
        exit(1);
      }*/
      
      if(numbytes > maxline) {
	maxline = numbytes-1;
      }
      sendcharcount += numbytes;
      sendlinecount++;
      
      if ((fgets(buf_recv,MAXDATASIZE,rsock)) == NULL) {
	perror("read");
        exit(1);
      }
      
      fflush(rsock);
      /*if ((numbytes=read(sockfd, buf_recv, MAXDATASIZE)) == -1) {
        perror("read");
        exit(1);
      }*/

      recvcharcount += numbytes;
      recvlinecount++;

      buf_recv[strlen(buf_recv)+1] = '\0';

      fputs(buf_recv, stdout);
    }

    close(sockfd);

    stop_time=times(&str_stop_time);
    
    time=((double)stop_time-(double)start_time)/(double)sysconf(_SC_CLK_TCK);

    fprintf(stderr,"Numero de linhas enviadas: %d\nTamanho em caracteres da maior linha: %d\nNumero total de caracteres enviados: %d\nNumero de linhas recebidas: %d\nNumero total de caracteres recebidos: %d\nTempo: %lf\n", sendlinecount, maxline, sendcharcount, recvlinecount, recvcharcount, time);

    return 0;
}



